//
// Created by Administrator on 2021/5/6.
//

/*
未知 整数数组 arr 由 n 个非负整数组成。

经编码后变为长度为 n - 1 的另一个整数数组 encoded ，其中 encoded[i] = arr[i] XOR arr[i + 1] 。
 例如，arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。

给你编码后的数组 encoded 和原数组 arr 的第一个元素 first（arr[0]）。

请解码返回原数组 arr 。可以证明答案存在并且是唯一的。

示例 1：
输入：encoded = [1,2,3], first = 1
输出：[1,0,2,1]
解释：若 arr = [1,0,2,1] ，那么 first = 1 且 encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]

示例 2：
输入：encoded = [6,2,7,3], first = 4
输出：[4,2,0,7,4]


提示：
2 <= n <= 104
encoded.length == n - 1
0 <= encoded[i] <= 105
0 <= first <= 105

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/decode-xored-array
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/
#include <vector>
#include <iostream>

using namespace std;

class Solution {
public:
    vector<int> decode(vector<int> &encoded, int first) {
        /**
         * 异或的性质
         * 在C++中，为^运算符
        异或运算满足交换律和结合律；
        任意整数和自身做异或运算的结果都等于 0，即 x ⊕ x = 0
        任意整数和 0 做异或运算的结果都等于其自身，即 x⊕0=0⊕x=x
         encoded[i] = arr[i] ^ arr[i+1]
         两边异或上arr[i]:
         arr[i]^encoded[i] = arr[i]^arr[i]^arr[i+1]
         注意到 右边 = 0 ^ arr[i+1] = arr[i+1]
         故  arr[i+1] = arr[i] ^ encoded[i]
         * @return
         */
        vector<int> origin(encoded.size() + 1, 0);
        origin[0] = first;
        for (int i = 1; i < origin.size(); ++i) {
            origin[i] = encoded[i - 1] ^ origin[i - 1];
        }
        return origin;
    }
};


int main() {
    vector<int> v{1, 2, 3};
    vector<int> v2{6, 2, 7, 3};
    Solution sol;
    auto ans = sol.decode(v, 1);
    for (const auto &x:ans) cout << x << endl;
    ans = sol.decode(v2, 4);
    for (const auto &x:ans) cout << x << endl;
    return 0;
}